package com.sh;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        // 1. 加载类  这种办法主要是在源代码时期
        Class<?> clazz = Class.forName("com.sh.pojo.Person");

        // 2. 创建对象实例
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        Object person = constructor.newInstance();

        // 3. 调用 setName 方法
        Method setNameMethod = clazz.getMethod("setName", String.class);
        setNameMethod.invoke(person, "小明");

        // 4. 访问私有字段 name
        Field nameField = clazz.getDeclaredField("name");
        nameField.setAccessible(true); // 解除私有访问限制
        String nameValue = (String) nameField.get(person);
        System.out.println("通过反射获取 name 字段值: " + nameValue);

        // 5. 调用 sayHello 方法
        Method sayHelloMethod = clazz.getMethod("sayHello");
        sayHelloMethod.invoke(person);
    }
}
